# Source : https://leetcode-cn.com/problems/word-pattern/
# Author : jkbs487
# Date   : 2020-12-16

##################################################################################################### 
#
# Given a pattern and a string s, find if s follows the same pattern.
# 
# Here follow means a full match, such that there is a bijection between a letter in pattern and a 
# non-empty word in s.
# 
# Example 1:
# 
# Input: pattern = "abba", s = "dog cat cat dog"
# Output: true
# 
# Example 2:
# 
# Input: pattern = "abba", s = "dog cat cat fish"
# Output: false
# 
# Example 3:
# 
# Input: pattern = "aaaa", s = "dog cat cat dog"
# Output: false
# 
# Example 4:
# 
# Input: pattern = "abba", s = "dog dog dog dog"
# Output: false
# 
# Constraints:
# 
# 	1 <= pattern.length <= 300
# 	pattern contains only lower-case English letters.
# 	1 <= s.length <= 3000
# 	s contains only lower-case English letters and spaces ' '.
# 	s does not contain any leading or trailing spaces.
# 	All the words in s are separated by a single space.
#####################################################################################################

class Solution:
    def wordPattern(self, pattern: str, s: str) -> bool:
        pattern2words = dict()
        words2pattern = dict()
        words = s.split(' ')
        if len(pattern) != len(words):
            return False
        for (p, word) in zip(pattern, words):
            if p in pattern2words and pattern2words[p] != word:
                return False
            else:
                pattern2words[p] = word
            if word in words2pattern and words2pattern[word] != p:
                return False
            else:
                words2pattern[word] = p
        return True
